#ifndef __CIRCLE_QUEUE_HH__
#define __CIRCLE_QUEUE_HH__
#include <iostream>
#include <stdlib.h>

template <class T>
class CircleQueue
{
private:
  //内部元素队列指针
  T d_rear, d_front;

  size_t d_size;
  size_t d_maxsize;
  T *d_arr;

public:
  //默认构造函数
  CircleQueue();

  //自定义构造函数
  CircleQueue(size_t);

  //析构函数
  ~CircleQueue();

  //拷贝构造函数
  CircleQueue(const CircleQueue &);

  //移动构造函数
  CircleQueue(CircleQueue &&);

  //踢队操作
  T deque();

  //入队操作
  void enque(const T &);

  //获取尺寸
  size_t size() const;

  //查看队列首端元素
  T front() const;

  //查看队列末端元素
  T rear() const;

  //队列是否非空
  bool is_empty() const;

  //队列是否已满
  bool is_full() const;

  //返回队列已有数量
  const size_t size();

  //缓存
  const T *buffer();

  //打印队列
  template <class R>
  friend std::ostream &operator<<(std::ostream &, CircleQueue<R> &);
};
#endif